import CustomPickerView from '../customPickerView/index.vue';
import DateUtil from '../dateTimePicker/dateUtil';

export default {
	components: {
		CustomPickerView
	},
	props: {
		// 日期模式，1：年月日，2：年月，3：年份，4：年月日时分秒
		mode: {
			type: Number,
			default: 1
		},
		// 可选的最小日期，默认十年前
		minDate: {
			type: String,
			default: ''
		},
		// 可选的最大日期，默认十年后
		maxDate: {
			type: String,
			default: ''
		},
		// 默认选中日期（注意要跟日期模式对应）
		defaultDate: {
			type: String,
			default: ''
		}
	},
	data() {
		return {
			selectYear: new Date().getFullYear(),
			selectMonth: new Date().getMonth() + 1, // 选中的月份，1~12
			selectDay: new Date().getDate(),
			selectHour: new Date().getHours(),
			selectMinute: new Date().getMinutes(),
			selectSecond: new Date().getSeconds()
		};
	},
	watch: {
		defaultDate: {
			handler(val, oldVal) {

				if (val) {
					if (this.mode == 2 && val.replace(/\-/g, '/').split('/').length == 2) {
						// 日期模式为年月时有可能传进来的defaultDate是2022-02这样的格式，在ios下new Date会报错，加上日期部分做兼容
						val += '-01';
					}

					let date = new Date(DateUtil.handleDateStr(val));

					if (this.mode == 2) {
						this.selectYear = date.getFullYear();
						this.selectMonth = date.getMonth() + 1;
					} else if (this.mode == 3) {
						this.selectYear = date.getFullYear();
					} else if (this.mode == 4) {
						this.selectYear = date.getFullYear();
						this.selectMonth = date.getMonth() + 1;
						this.selectDay = date.getDate();
						this.selectHour = date.getHours();
						this.selectMinute = date.getMinutes();
						this.selectSecond = date.getSeconds();
					} else {
						this.selectYear = date.getFullYear();
						this.selectMonth = date.getMonth() + 1;
						this.selectDay = date.getDate();
					}
				}
			},
			immediate: true
		}
	},
	computed: {
		minDateObj() {
			let minDate = this.minDate;
			if (minDate) {
				if (this.mode == 2 && minDate.replace(/\-/g, '/').split('/').length == 2) {
					// 日期模式为年月时有可能传进来的minDate是2022-02这样的格式，在ios下new Date会报错，加上日期部分做兼容
					minDate += '-01';
				}
				return new Date(DateUtil.handleDateStr(minDate));
			} else {
				// 没有传最小日期，默认十年前
				let year = new Date().getFullYear() - 10;
				minDate = new Date(year, 0, 1);
				return minDate;
			}
		},
		maxDateObj() {
			let maxDate = this.maxDate;
			if (maxDate) {
				if (this.mode == 2 && maxDate.replace(/\-/g, '/').split('/').length == 2) {
					// 日期模式为年月时有可能传进来的maxDate是2022-02这样的格式，在ios下new Date会报错，加上日期部分做兼容
					maxDate += '-01';
				}
				return new Date(DateUtil.handleDateStr(maxDate));
			} else {
				// 没有传最大日期，默认十年后
				let year = new Date().getFullYear() + 10;
				maxDate = new Date(year, 11, 31);
				return maxDate;
			}
		},
		years() {
			let years = [];
			let minYear = this.minDateObj.getFullYear();
			let maxYear = this.maxDateObj.getFullYear();
			for (let i = minYear; i <= maxYear; i++) {
				years.push(i);
			}

			return years;
		},
		months() {
			let months = [];
			let minMonth = 1;
			let maxMonth = 12;

			// 如果选中的年份刚好是最小可选日期的年份，那月份就要从最小日期的月份开始
			if (this.selectYear == this.minDateObj.getFullYear()) {
				minMonth = this.minDateObj.getMonth() + 1;
			}
			// 如果选中的年份刚好是最大可选日期的年份，那月份就要在最大日期的月份结束
			if (this.selectYear == this.maxDateObj.getFullYear()) {
				maxMonth = this.maxDateObj.getMonth() + 1;
			}

			for (let i = minMonth; i <= maxMonth; i++) {
				months.push(i);
			}

			return months;
		},
		days() {
			// 一年中12个月每个月的天数
			let monthDaysConfig = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
			// 闰年2月有29天
			if (this.selectMonth == 2 && this.selectYear % 4 == 0) {
				monthDaysConfig[1] = 29;
			}

			let minDay = 1;
			let maxDay = monthDaysConfig[this.selectMonth - 1];

			if (this.selectYear == this.minDateObj.getFullYear() && this.selectMonth == this.minDateObj.getMonth() +
				1) {
				minDay = this.minDateObj.getDate();
			}
			if (this.selectYear == this.maxDateObj.getFullYear() && this.selectMonth == this.maxDateObj.getMonth() +
				1) {
				maxDay = this.maxDateObj.getDate();
			}

			let days = [];
			for (let i = minDay; i <= maxDay; i++) {
				days.push(i);
			}

			return days;
		},
		hours() {
			let hours = [];
			let minHour = 0;
			let maxHour = 23;

			if (
				this.selectYear == this.minDateObj.getFullYear() &&
				this.selectMonth == this.minDateObj.getMonth() + 1 &&
				this.selectDay == this.minDateObj.getDate()
			) {
				minHour = this.minDateObj.getHours();
			}
			if (
				this.selectYear == this.maxDateObj.getFullYear() &&
				this.selectMonth == this.maxDateObj.getMonth() + 1 &&
				this.selectDay == this.maxDateObj.getDate()
			) {
				maxHour = this.maxDateObj.getHours();
			}

			for (let i = minHour; i <= maxHour; i++) {
				hours.push(i);
			}

			return hours;
		},
		minutes() {
			let mins = [];
			let minMin = 0;
			let maxMin = 59;

			if (
				this.selectYear == this.minDateObj.getFullYear() &&
				this.selectMonth == this.minDateObj.getMonth() + 1 &&
				this.selectDay == this.minDateObj.getDate() &&
				this.selectHour == this.minDateObj.getHours()
			) {
				minMin = this.minDateObj.getMinutes();
			}
			if (
				this.selectYear == this.maxDateObj.getFullYear() &&
				this.selectMonth == this.maxDateObj.getMonth() + 1 &&
				this.selectDay == this.maxDateObj.getDate() &&
				this.selectHour == this.maxDateObj.getHours()
			) {
				maxMin = this.maxDateObj.getMinutes();
			}

			for (let i = minMin; i <= maxMin; i++) {
				mins.push(i);
			}

			return mins;
		},
		seconds() {
			let seconds = [];
			let minSecond = 0;
			let maxSecond = 59;

			if (
				this.selectYear == this.minDateObj.getFullYear() &&
				this.selectMonth == this.minDateObj.getMonth() + 1 &&
				this.selectDay == this.minDateObj.getDate() &&
				this.selectHour == this.minDateObj.getHours() &&
				this.selectMinute == this.minDateObj.getMinutes()
			) {
				minSecond = this.minDateObj.getSeconds();
			}
			if (
				this.selectYear == this.maxDateObj.getFullYear() &&
				this.selectMonth == this.maxDateObj.getMonth() + 1 &&
				this.selectDay == this.maxDateObj.getDate() &&
				this.selectHour == this.maxDateObj.getHours() &&
				this.selectMinute == this.maxDateObj.getMinutes()
			) {
				maxSecond = this.maxDateObj.getSeconds();
			}

			for (let i = minSecond; i <= maxSecond; i++) {
				seconds.push(i);
			}

			return seconds;
		},
		// 传给pickerView组件的数组，根据mode来生成不同的数据
		dateConfig() {
			if (this.mode == 2) {
				// 年月模式
				let years = this.years.map((y) => y + '年');
				let months = this.months.map((m) => m + '月');
				return [years, months];
			} else if (this.mode == 3) {
				// 只有年份模式
				let years = this.years.map((y) => y + '年');
				return [years];
			} else if (this.mode == 4) {
				// 年月日时分秒模式
				let years = this.years.map((y) => y + '年');
				let months = this.months.map((m) => m + '月');
				let days = this.days.map((d) => d + '日');
				let hours = this.hours.map((h) => h + '时');
				let minutes = this.minutes.map((m) => m + '分');
				let seconds = this.seconds.map((s) => s + '秒');
				return [years, months, days, hours, minutes, seconds];
			} else {
				// 默认，年月日模式
				let years = this.years.map((y) => y + '年');
				let months = this.months.map((m) => m + '月');
				let days = this.days.map((d) => d + '日');
				return [years, months, days];
			}
		},
		selectVals() {
			if (this.mode == 2) {
				return [this.selectYear + '年', this.selectMonth + '月'];
			} else if (this.mode == 3) {
				return [this.selectYear + '年'];
			} else if (this.mode == 4) {
				return [
					this.selectYear + '年',
					this.selectMonth + '月',
					this.selectDay + '日',
					this.selectHour + '时',
					this.selectMinute + '分',
					this.selectSecond + '秒'
				];
			} else {
				return [this.selectYear + '年', this.selectMonth + '月', this.selectDay + '日'];
			}
		}
	},
	methods: {
		onChangePickerValue(e) {
			const {
				value
			} = e;
			// console.log('onChangePickerValue', value);

			if (this.mode == 2 && value[0] && value[1]) {
				// 年月模式
				this.selectYear = Number(value[0].replace('年', ''));
				this.selectMonth = Number(value[1].replace('月', ''));
			} else if (this.mode == 3 && value[0]) {
				// 只有年份模式
				this.selectYear = Number(value[0].replace('年', ''));
			} else if (this.mode == 4 && value[0] && value[1] && value[2] != '' && value[3] && value[4] && value[5]) {
				// 年月日时分秒模式
				this.selectYear = Number(value[0].replace('年', ''));
				this.selectMonth = Number(value[1].replace('月', ''));
				this.selectDay = Number(value[2].replace('日', ''));
				this.selectHour = Number(value[3].replace('时', ''));
				this.selectMinute = Number(value[4].replace('分', ''));
				this.selectSecond = Number(value[5].replace('秒', ''));
			} else if (value[0] && value[1] && value[2]) {
				// 默认，年月日模式
				this.selectYear = Number(value[0].replace('年', ''));
				this.selectMonth = Number(value[1].replace('月', ''));
				this.selectDay = Number(value[2].replace('日', ''));
			} else {
				// 其他情况可能是pickerView返回的数据有问题，不处理
				console.log('onChangePickerValue其他情况');
				return;
			}

			let formatTmpl = 'YYYY-MM-DD';
			if (this.mode == 2) {
				formatTmpl = 'YYYY-MM';
			} else if (this.mode == 3) {
				formatTmpl = 'YYYY';
			} else if (this.mode == 4) {
				formatTmpl = 'YYYY-MM-DD HH:mm:ss';
			}

			this.$emit(
				'onChange',
				DateUtil.formatDate(
					new Date(
						`${this.selectYear}/${this.selectMonth}/${this.selectDay} ${this.selectHour}:${this.selectMinute}:${this.selectSecond}`
						),
					formatTmpl
				)
			);
		}
	}
};
